package com.xinyue.ext;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.xinyue.ext.data.EntityData;
import com.xinyue.ext.exception.ExceptionBase;
import com.xinyue.ext.exception.XmlException;
import com.xinyue.ext.reader.CoreReader;
import com.xinyue.ext.util.StringUtil;

/**
 * 使用Dom4j解析XML文件
 * 返回EntityData类型数据，一个EntityData对象，对应XML文件中的一个entity标签
 * entity中包括一个bean、dao、daoImpl对象的所有信息
 */
public class XmlReader implements Label{
	
	/**
	 * 读取所有XML配置文件中的Entity信息，并封装返回对象。
	 * @param paths
	 * @return Data类型数据
	 */
	@SuppressWarnings("unchecked")
	public List<EntityData> readXml(List<String> paths) throws Exception {
		List<EntityData> datas = new ArrayList<EntityData>();
		
		SAXReader reader = new SAXReader();
		//创建异常信息
		ExceptionBase exception = new ExceptionBase();
		for (int i = 0; i < paths.size(); i++) {
			exception.setXmlPath(paths.get(i));
			
			Element root = null;
			try {
				//读取一个配置文件
				Document document = reader.read(new File(paths.get(i)));
				root = document.getRootElement();
			} catch (DocumentException e) {
				throw new Exception("XML文档路径无效：" + paths.get(i), e);
			}
			
			String beanPackage = root.element(bean_package_).attributeValue(package_);
			String daoPackage = root.element(dao_package_).attributeValue(package_);
			if(StringUtil.isNull(beanPackage)) {
				throw new XmlException("文档中未定义bean-package标签或其值为空", exception);
			}
			if(StringUtil.isNull(daoPackage)) {
				throw new XmlException("文档中未定义dao-package标签或其值为空", exception);
			}
			
			/**读取一个XML文件中的所有entity标签信息
			 */
			List<Element> entites = root.elements(entity_);
			if(entites == null) {
				throw new XmlException("文档中未定义entity标签", exception);
			}
			
			//读取一个XML文件中entity标签信息
			CoreReader core = CoreReader.getInstance(exception);
			List<EntityData> xmlData = core.read(entites, beanPackage, daoPackage);
			
			datas.addAll(xmlData);
		}
		
		return datas;
	}
}
